Zabbix API を操作するRubyライブラリ zbxapi を拡張する
はじめに
こんにちは、川原です。
最近、Zabbix を API 経由で操作することが多いです。
その際、Zabbix APIを直に操作するのではなく、Ruby の Zabbix API 操作ライブラリの zbxapi 経由で操作しているのですが、以外と簡単に操作できてこれは便利です。
zbxapi を使ったZabbix API操作については以下のぶろぐ記事も参考になります。
ただ、このライブラリ、全てのZabbixAPIには対応しておらず、操作できないAPIがあります。
今回、ライブラリを拡張し、デフォルトでは操作できないAPIを操作できるようにしてみたので紹介します。
前提
実行環境は以下です。
ruby: 2.0.0p481 (2014-05-08 revision 45883) [universal.x86_64-darwin14]
zbxapi: 0.3.10
接続先Zabbix:Zabbix 3.0.0alpha2
やってみた
まず、以下のようなZabbixに登録してあるスクリプトを取得するRubyプログラム(zabbix_test.rb)を作成してみます。
APIアクセス先のFQDN名とか、アカウントID、パスワードは適切に置き換えてください。
require 'zbxapi' require 'pp' zabbix = ZabbixAPI.new('http://YOURHOSTNAME.com/zabbix') zabbix.login('YOUR_ACCOUNT_ID', 'PASSWORD') pp scripts = zabbix.script.get()
で、実行してみます。
>ruby ~/bin/zabbix_test.rb /Users/kawahara.kunio/bin/zabbix_test.rb:7:in `<main>': undefined method `script' for #<ZabbixAPI:0x007fadfb0337b0> (NoMethodError)
上記の通り、NoMethodError
が発生してしまいます。
これは、zbxapi ライブラリにZabbixのscriptを操作するメソッドが存在していないためです(エラー名の通り)。
存在しないなら作成してしまおう、ということなのですが、zbxapi では非常に簡単に追加できます。
以下の通り、先ほどのスクリプトに都合4行ほど追加して実行してみましょう。
require 'zbxapi' require 'pp' # ここから 追加 require "api_classes/api_dsl" class Script < ZabbixAPI_Base actions :get, :create, :update, :delete end # ここまで 追加 zabbix = ZabbixAPI.new('http://YOURHOSTNAME.com/zabbix') zabbix.login('YOUR_ACCOUNT_ID', 'PASSWORD') pp scripts = zabbix.script.get()
実行結果は下記の通り。エラーは発生せず、結果は pp
メソッドで整形されて出力されています。
>ruby ~/bin/zabbix_test.rb [{"scriptid"=>"47", "name"=>"テスト用スクリプト", "command"=> "/home/ec2-user/test_script.rb", "host_access"=>"2", "usrgrpid"=>"52", "groupid"=>"113", "description"=>"", "confirmation"=>"テスト用確認メッセージ", "type"=>"0", "execute_on"=>"1"}, 〜〜省略〜〜
補足
zbxapiにおいて、ユーザーが使用する各クラスは以下の通り、gemのapi_classes
ディレクトリ配下にあります。
>ls -l /Library/Ruby/Gems/2.0.0/gems/zbxapi-0.3.10/api_classes/ total 224 -rw-r--r-- 1 root wheel 14K 11 14 14:16 api_dsl.rb -rw-r--r-- 1 root wheel 1.0K 11 14 14:16 dsl_action.rb -rw-r--r-- 1 root wheel 1.0K 11 14 14:16 dsl_alert.rb -rw-r--r-- 1 root wheel 1.0K 11 14 14:16 dsl_configuration.rb -rw-r--r-- 1 root wheel 1.0K 11 14 14:16 dsl_dcheck.rb -rw-r--r-- 1 root wheel 1.0K 11 14 14:16 dsl_dhost.rb -rw-r--r-- 1 root wheel 1.1K 11 14 14:16 dsl_drule.rb -rw-r--r-- 1 root wheel 1.0K 11 14 14:16 dsl_dservice.rb -rw-r--r-- 1 root wheel 1.2K 11 14 14:16 dsl_event.rb -rw-r--r-- 1 root wheel 1.2K 11 14 14:16 dsl_graph.rb -rw-r--r-- 1 root wheel 1.2K 11 14 14:16 dsl_history.rb -rw-r--r-- 1 root wheel 6.1K 11 14 14:16 dsl_host.rb -rw-r--r-- 1 root wheel 1.3K 11 14 14:16 dsl_hostgroup.rb -rw-r--r-- 1 root wheel 1.1K 11 14 14:16 dsl_hostinterface.rb -rw-r--r-- 1 root wheel 1.2K 11 14 14:16 dsl_item.rb -rw-r--r-- 1 root wheel 1.1K 11 14 14:16 dsl_maintenance.rb -rw-r--r-- 1 root wheel 1.2K 11 14 14:16 dsl_mediatype.rb -rw-r--r-- 1 root wheel 1.2K 11 14 14:16 dsl_proxy.rb -rw-r--r-- 1 root wheel 1.3K 11 14 14:16 dsl_template.rb -rw-r--r-- 1 root wheel 3.5K 11 14 14:16 dsl_trigger.rb -rw-r--r-- 1 root wheel 1.3K 11 14 14:16 dsl_user.rb -rw-r--r-- 1 root wheel 1.3K 11 14 14:16 dsl_usergroup.rb -rw-r--r-- 1 root wheel 1.3K 11 14 14:16 dsl_usermacro.rb -rw-r--r-- 1 root wheel 1.2K 11 14 14:16 dsl_usermedia.rb
ファイル名から想像できる通り、dsl_XXXX.rb
の各ファイルはZabbixの要素1を操作するためのクラスに対応します。
ここに存在するファイルに対応する要素については、デフォルトで操作できます。存在しない要素については、今回のように対応する操作クラスを追加する必要があります。
ホストを操作するHost
クラスについて、一部を抜粋で表示します。
>cat /Library/Ruby/Gems/2.0.0/gems/zbxapi-0.3.10/api_classes/dsl_host.rb 〜〜省略〜〜 class Host < ZabbixAPI_Base action :get do #arg_processor "1.3" do |params| # params["output"]="extend" # params #end parameters "1.3", "nodeids","groupids","hostids","templateids","itemids","triggerids", "graphids","proxyids","maintenanceids","dhostids","dserviceids", "monitored_hosts","templated_hosts","proxy_hosts","with_items", "with_monitored_items","with_historical_items","with_triggers", "with_monitored_triggers","with_httptests", "with_monitored_httptests","with_graphs","editable","filter", "search","startSearch","excludeSearch","searchWildcardsEnabled", "output","select_groups","selectParentTemplates","select_items", "select_triggers","select_graphs","select_applications", "selectInterfaces","select_macros","select_profile","countOutput", "groupOutput","preservekeys","sortfield","sortorder","limit", "extendoutput" 〜〜省略〜〜
各クラスには、要素に対する操作(アクション)とそのパラメータが記載されています。パラメータについては、定義しなくても動作するようです(今回試しに追加したScript
クラスにはアクションだけを定義しています)。
恐らく、API呼び出し時に指定されたパラメータをチェックに追加するのだと思います。
まとめ
いかがでしたでしょうか?
zbxapiライブラリは簡単に拡張できますね。
もし、ライブラリ側でクラスやメソッドが不足していた場合は、必要なものを自分で追加して、Zabbixをプログラムで操作していきましょう。
- ホストやホストグループ、テンプレート、トリガなど。詳細はZabbix APIリファレンスに記載されています。 ↩